home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Graphics
/
MapMaker
/
Source
/
ControlObject.m
< prev
next >
Wrap
Text File
|
1990-12-08
|
10KB
|
631 lines
/* Generated by Interface Builder */
#import "ControlObject.h"
#import "InputView.h"
#import "OutputView.h"
#import "constants.h"
#import "pointdata.h"
#import "proj.h"
#import "fractal.h"
#import <appkit/appkit.h>
#import <math.h>
int started = 0;
float roundToNearestDivisible(float f)
{
int g,b,l;
if (f<MINROT) {
f = MINROT;
return f;
}
if (f>MAXROT) {
f = MAXROT;
return f;
}
for(g = round(f); ((360%g) && (g<=MAXROT)); g++)
for(l = round(f); ((360%l) && (l>= MINROT)); l--);
if (l< MINROT)
l = MINROT;
if (g> MAXROT)
g = MAXROT;
if ((fabs(g-round(f))) < fabs((round(f)-l)))
return (float)g;
else
return (float)l;
}
float normalize(float p)
{
int mult;
int rem;
mult = (round(p))/180;
rem = ((int)(round(p)))%180;
if (mult%2)
return (-180 + (p-(180*mult)));
else
return p-(180*mult);
}
@implementation ControlObject
- setIView:anObject
{
iView = anObject;
return self;
}
- setGridCell:anObject
{
gridCell = anObject;
return self;
}
- setGridCell2:anObject
{
gridCell2 = anObject;
return self;
}
- setOView:anObject
{
oView = anObject;
return self;
}
- setProjType:anObject
{
projType = anObject;
return self;
}
-setElevationfield:anObject
{
elevationfield = anObject;
return self;
}
- setSlider:anObject
{
slider = anObject;
return self;
}
- setStep:anObject
{
step = anObject;
return self;
}
- setBbplay:anObject
{
bbplay = anObject;
return self;
}
- setBplay:anObject
{
bplay = anObject;
return self;
}
- setStop:anObject
{
stop = anObject;
return self;
}
- setFplay:anObject
{
fplay = anObject;
return self;
}
- setFfplay:anObject
{
ffplay = anObject;
return self;
}
- setProjectionMatrix:anObject
{
projectionMatrix = anObject;
return self;
}
- setScaleField:anObject
{
scaleField = anObject;
return self;
}
- setRotationField:anObject
{
rotationField = anObject;
return self;
}
- setAlertWindow:anObject
{
alertWindow = anObject;
return self;
}
- setAlertText:anObject
{
alertText = anObject;
return self;
}
- setHValueField:anObject
{
hValueField = anObject;
return self;
}
- setStDevField:anObject
{
stDevField = anObject;
return self;
}
- setFractStateButton:anObject
{
fractStateButton = anObject;
return self;
}
- setTimeSliceField:anObject
{
timeSliceField = anObject;
return self;
}
- setRateSlider:anObject
{
rateSlider = anObject;
return self;
}
- setInputMode:anObject
{
inputMode = anObject;
return self;
}
- setInputX:anObject
{
inputX = anObject;
return self;
}
- setInputY:anObject
{
inputY = anObject;
return self;
}
- setInputPen:anObject
{
inputPen = anObject;
return self;
}
- saveiView:sender
{
[iView saveFile];
return self;
}
- openiView:sender
{
[iView openFile];
return self;
}
- newiView:sender
{
[iView clearFile];
return self;
}
- gridStateChanged:sender
{
BOOL oldGridState;
oldGridState = [iView gridState];
if (oldGridState==YES) {
[gridCell setTitle:"Set Grid On"];
[iView setGridState:NO];
} else {
[gridCell setTitle:"Set Grid Off"];
[iView setGridState:YES];
}
[[iView window] display];
return self;
}
- gridStateChanged2:sender
{
BOOL oldGridState;
oldGridState = [oView gridState];
if (oldGridState==YES) {
[gridCell2 setTitle:"Set Grid On"];
[oView setGridState:NO];
} else {
[gridCell2 setTitle:"Set Grid Off"];
[oView setGridState:YES];
}
if (!animation)
[self refreshOutput];
return self;
}
- start
{
float f;
started = 1;
[iView setGridState:YES];
[iView setItUp:self];
[[iView window] display];
[timeSliceField setFloatValue:[rateSlider floatValue]];
[oView setGridState:YES];
[oView setItUp:self];
[oView rateChanged:[timeSliceField floatValue]];
[[oView window] display];
force = 1;
[stop setEnabled:NO];
pparam.radius = [scaleField floatValue];
f= [elevationfield floatValue];
if ((f<(-90.0)) || (f>90.0)) {
[elevationfield setFloatValue:0.0];
[slider setFloatValue:0.0];
pparam.phi1 = 0.0;
}
else {
[slider setFloatValue:f];
pparam.phi1 = (f/180) * PI;
}
f = normalize([rotationField floatValue]);
[rotationField setFloatValue:f];
pparam.lon0 = ((f/180) * PI);
pparam.proj = [[projType selectedCell] tag];
animation = STOPPED;
[self getNewInput];
[self refreshOutput];
return self;
}
- appDidInit:sender
{
/* This part gets around the fact that if a document is opened, the "open" program */
/* will call appOpenFile before appDidInit.*/
if (!started)
[self start];
}
- (BOOL)appAcceptsAnotherFile:(id)sender
{
return YES;
}
- (int)appOpenFile:(const char *)filename type:(const char *)aType
{
if (!started)
[self start];
[iView openFile:filename];
return 1;
}
- rotationFieldChanged:sender
{
float f;
f = normalize([sender floatValue]);
[sender setFloatValue:f];
if (!animation)
[self refreshOutput];
return self;
}
- scaleFieldChanged:sender
{
pparam.radius = [sender floatValue];
if (!animation)
[self refreshOutput];
return self;
}
- elevationfieldchanged:sender
{
float f;
f= [sender floatValue];
if ((f<(-90.0)) || (f>90.0)) {
[sender setFloatValue:[slider floatValue]];
f = [slider floatValue];
}
else {
[slider setFloatValue:f];
[sender setFloatValue:f];
pparam.phi1 = (f/180) * PI;
}
if (!animation)
[self refreshOutput];
return self;
}
- slidermoved:sender
{
float f;
f= [sender floatValue];
[elevationfield setFloatValue:f];
pparam.phi1 = (f/180) * PI;
if (!animation)
[self refreshOutput];
return self;
}
- stepChanged:sender
{
float f;
f = [sender floatValue];
pparam.lon0 = ((f/180)*PI);
if (!animation)
[self refreshOutput];
return self;
}
- projChanged:sender
{
pparam.proj = [[sender selectedCell] tag];
if (!animation)
[self refreshOutput];
return self;
}
- disableControls
{
[bbplay setEnabled:NO];
[bplay setEnabled:NO];
[stop setEnabled:YES];
[fplay setEnabled:NO];
[ffplay setEnabled:NO];
[projType setEnabled:NO];
[slider setEnabled:NO];
[elevationfield setEnabled:NO];
[scaleField setEnabled:NO];
[rotationField setEnabled:NO];
[step setEnabled:NO];
return self;
}
- enableControls
{
[bbplay setEnabled:YES];
[bplay setEnabled:YES];
[stop setEnabled:NO];
[fplay setEnabled:YES];
[ffplay setEnabled:YES];
[projType setEnabled:YES];
[slider setEnabled:YES];
[elevationfield setEnabled:YES];
[scaleField setEnabled:YES];
[rotationField setEnabled:YES];
[step setEnabled:YES];
return self;
}
- bbplayed:sender
{
float f;
[stop setEnabled:NO];
f = [rotationField floatValue];
[rotationField setFloatValue:(normalize(f+[step floatValue]))];
[self refreshOutput];
return self;
}
- bplayed:sender
{
float f;
[self disableControls];
f = [step floatValue];
f = roundToNearestDivisible(f);
[step setFloatValue:f];
animation = BACKWARD;
[self refreshOutput];
return self;
}
- stopped:sender
{
[self enableControls];
animation = STOPPED;
[self refreshOutput];
return self;
}
- fplayed:sender
{
float f;
[self disableControls];
f = [step floatValue];
f = roundToNearestDivisible(f);
[step setFloatValue:f];
animation = FORWARD;
[self refreshOutput];
return self;
}
- ffplayed:sender
{
float f;
[stop setEnabled:YES];
f = [rotationField floatValue];
[rotationField setFloatValue:(normalize(f-[step floatValue]))];
[self refreshOutput];
return self;
}
- getNewInput
{
PointList *inList;
if (segList.quantity)
freePointList(&segList);
newPointList(&segList);
[iView map:&inList];
setFValues([fractStateButton state],[hValueField floatValue],[stDevField floatValue]);
insertFSegments(inList,&segList,&pparam);
force = 1;
return self;
}
- refreshOutput
{
float f;
pparam.lon0 = (([rotationField floatValue]/180) * PI);
pparam.phi1 = ([elevationfield floatValue]/180)*PI;
if (animation) {
[oView setupAnimation:&pparam :[step floatValue] :&segList :force];
if (force) force = 0;
[oView startAnimating:animation];
} else {
if ([oView animation]) {
[oView stopAnimating:&f];
[rotationField setFloatValue:round(normalize(f))];
pparam.lon0 = (([rotationField floatValue]/180) * PI);
}
[oView doStill:&pparam:&segList];
}
return self;
}
- alertWindow
{
return alertWindow;
}
- alertText
{
return alertText;
}
- inputMode
{
return inputMode;
}
- inputX
{
return inputX;
}
- inputY
{
return inputY;
}
- inputPen
{
return inputPen;
}
- hValueChanged:sender
{
float f;
f = [sender floatValue];
if (f < 0.0)
[sender setFloatValue:0.0];
else if (f > 1.0)
[sender setFloatValue:1.0];
[self getNewInput];
[self refreshOutput];
return self;
}
- stDevChanged:sender
{
float f;
f = [sender floatValue];
if (f < 0.0)
[sender setFloatValue:0.0];
else if (f > 1.0)
[sender setFloatValue:1.0];
[self getNewInput];
[self refreshOutput];
return self;
}
- fractalStateChanged:sender
{
[self getNewInput];
[self refreshOutput];
return self;
}
- timeSliceChanged:sender
{
float f;
f = [sender floatValue];
if (f < [rateSlider minValue])
f = [rateSlider minValue];
else if (f > 0.5)
f = [rateSlider maxValue];
[timeSliceField setFloatValue:f];
[rateSlider setFloatValue:f];
[oView rateChanged:f];
return self;
}
- rateSliderChanged:sender
{
float f;
f = [sender floatValue];
if (f < [rateSlider minValue])
f = [rateSlider minValue];
else if (f > [rateSlider maxValue])
f = [rateSlider maxValue];
[timeSliceField setFloatValue:f];
[rateSlider setFloatValue:f];
[oView rateChanged:f];
return self;
}
- printOutput:sender
{
[oView doPrint:&pparam:&segList];
return self;
}
- mapIt:sender
{
[self getNewInput];
[self refreshOutput];
return self;
}
@end